package com.quique.pfc.servicios;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;

import android.util.Log;

import com.quique.pfc.datos.Sesion;
import com.quique.pfc.utils.Constantes;

/** Servicio de logica de negocio encargado de subir los ficheros a Moodle */
public class UploadService 
{
	static String lineEnd = "\r\n";
    static String twoHyphens = "--";
    static String boundary = "AaB03x87yxdkjnxvi7";
    
    /**
     * Sube un fichero al servidor de moodle
     * @param path Path del fichero que se quere subir (en el telefono)
     * @param nombreFichero nombre con el que se quiere subir el fichero
     * @throws Exception si se produce alguna excepcion durante el proceso
     */
    public static void upload(String path, String nombreFichero)
    throws Exception
    {
    	String urlServer =  Sesion.url + Constantes.Urls.UPLOAD;
    	//url del servicio de ficheros de moodle
    	URL url = new URL(urlServer);
    	HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream dis = null;
        //componemos el InputStream que vamos a escribir en el servidor
        FileInputStream fileInputStream = new FileInputStream(new File(path));
        //se le pasan dos parametros:
        //1. El token del usuuario logado
        //2. El tipo de resultados que esperamos del servidor
        HashMap<String, String> parameters = new HashMap<String, String>();
        parameters.put("token", Sesion.token);
        parameters.put(Constantes.ParametrosNombres.FORMATO_RESULTADO,"json");
        
        byte[] buffer;
        int maxBufferSize = 20 * 1024;
        conn = (HttpURLConnection) url.openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
        dos = new DataOutputStream(conn.getOutputStream());
        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"" + nombreFichero
                + "\"; filename=\"" + nombreFichero + "\"" + lineEnd);
        dos.writeBytes("Content-Type: text/xml" + lineEnd);
        dos.writeBytes(lineEnd);
        buffer = new byte[Math.min((int) fileInputStream.available(), maxBufferSize)];
        int length;
        //leemos el fichero y escribimos en el form
        while ((length = fileInputStream.read(buffer)) != -1) {
            dos.write(buffer, 0, length);
        }
        //paso de parametros
        for (String name : parameters.keySet()) {
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"" + lineEnd);
            dos.writeBytes(lineEnd);
            dos.writeBytes(parameters.get(name));
        }
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
        dos.flush();
        if (fileInputStream != null) fileInputStream.close();
            if (dos != null) dos.close();
        //leemos la respuesta del servidor
        dis = new DataInputStream(conn.getInputStream());
        StringBuilder response = new StringBuilder();

        String line;
        while ((line = dis.readLine()) != null) {
            response.append(line).append('\n');
        }
        if (dis != null) dis.close();
        String respuesta = response.toString();
        Log.e("Moodle", respuesta);    
    	return;
    }
}
